#include "usart_CPPsupport.h"	
////////////////////////////////////////////////////////////////////////////////// 	 
//如果使用ucos,则包括下面的头文件即可.
#if SYSTEM_SUPPORT_OS
#include "includes.h"					//ucos 使用	  
#endif
//////////////////////////////////////////////////////////////////////////////////	 
//本程序只供学习使用，未经作者许可，不得用于其它任何用途
//ALIENTEK STM32开发板
//串口1初始化		   
//江弘源：C++串口打印支持
//修改日期:2022-7-30
////////////////////////////////////////////////////////////////////////////////// 	  
 
 
#pragma import(__use_no_semihosting) // 禁用半主机模式
 
// 请不要勾选Use MicroLib
#ifdef __MICROLIB
#error "Please do not use MicroLib!"
#endif

extern UART_HandleTypeDef huart4; //UART句柄

extern "C"
{
  void _sys_exit(int returncode)
  {
    printf("Exited! returncode=%d\n", returncode);
    while (1);
  }
  
  void _ttywrch(int ch)
  {
    if (ch == '\n')
      HAL_UART_Transmit(&huart4, (uint8_t *)"\r\n", 2, HAL_MAX_DELAY);
    else
      HAL_UART_Transmit(&huart4, (uint8_t *)&ch, 1, HAL_MAX_DELAY);
  }
}
 
namespace std
{
  struct __FILE
  {
    int handle;
    /* Whatever you require here. If the only file you are using is */
    /* standard output using printf() for debugging, no file handling */
    /* is required. */
  };
  
  FILE __stdin = {0};
  FILE __stdout = {1};
  FILE __stderr = {2};
  
  int fgetc(FILE *stream)
  {
    int c = 0;
    
    if (stream->handle == 0)
    {
      while (__HAL_UART_GET_FLAG(&huart4, UART_FLAG_RXNE) == RESET);
      HAL_UART_Receive(&huart4, (uint8_t *)&c, 1, HAL_MAX_DELAY);
      
      _ttywrch((c == '\r') ? '\n' : c); // 回显
      return c;
    }
    return EOF;
  }
  
  int fputc(int c, FILE *stream)
  {
    if (stream->handle == 1 || stream->handle == 2)
    {
      _ttywrch(c);
      return c;
    }
    return EOF;
  }
  
  int fclose(FILE * stream)
  {
    return 0;
  }
  
  int fseek(FILE *stream, long int offset, int whence)
  {
    return -1;
  }
  
  int fflush(FILE *stream)
  {
    if (stream->handle == 1 || stream->handle == 2)
      while (__HAL_UART_GET_FLAG(&huart4, UART_FLAG_TC) == RESET);
    return 0;
  }
}


#if EN_USART1_RX   //如果使能了接收
//串口1中断服务程序
//注意,读取USARTx->SR能避免莫名其妙的错误   	
uint8_t USART_RX_BUF[USART_REC_LEN];     //接收缓冲,最大USART_REC_LEN个字节.
//接收状态
//bit15，	接收完成标志
//bit14，	接收到0x0d
//bit13~0，	接收到的有效字节数目
uint16_t USART_RX_STA=0;       //接收状态标记	  

uint8_t aRxBuffer[RXBUFFERSIZE];//HAL库使用的串口接收缓冲

  

void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
	if(huart->Instance==USART1)//如果是串口1
	{
		if((USART_RX_STA&0x8000)==0)//接收未完成
		{
			if(USART_RX_STA&0x4000)//接收到了0x0d
			{
				if(aRxBuffer[0]!=0x0a)USART_RX_STA=0;//接收错误,重新开始
				else USART_RX_STA|=0x8000;	//接收完成了 
			}
			else //还没收到0X0D
			{	
				if(aRxBuffer[0]==0x0d)USART_RX_STA|=0x4000;
				else
				{
					USART_RX_BUF[USART_RX_STA&0X3FFF]=aRxBuffer[0] ;
					USART_RX_STA++;
					if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收	  
				}		 
			}
		}

	}
}
 
// //串口1中断服务程序
// void USART1_IRQHandler(void)                	
// { 
// 	uint32_t timeout=0;
// #if SYSTEM_SUPPORT_OS	 	//使用OS
// 	OSIntEnter();    
#endif
	
// 	HAL_UART_IRQHandler(&huart4);	//调用HAL库中断处理公用函数
	
// 	timeout=0;
//     while (HAL_UART_GetState(&huart4) != HAL_UART_STATE_READY)//等待就绪
// 	{
// 	 timeout++;////超时处理
//      if(timeout>HAL_MAX_DELAY) break;		
	
// 	}
     
// 	timeout=0;
// 	while(HAL_UART_Receive_IT(&huart4, (uint8_t *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)//一次处理完成之后，重新开启中断并设置RxXferCount为1
// 	{
// 	 timeout++; //超时处理
// 	 if(timeout>HAL_MAX_DELAY) break;	
// 	}
// #if SYSTEM_SUPPORT_OS	 	//使用OS
// 	OSIntExit();  											 
// #endif
// } 
// #endif	

/*下面代码我们直接把中断控制逻辑写在中断服务函数内部。*/

//串口1中断服务程序
//void USART1_IRQHandler(void)                	
//{ 
//	uint8_t Res;
//	HAL_StatusTypeDef err;
//#if SYSTEM_SUPPORT_OS	 	//使用OS
//	OSIntEnter();    
//#endif
//	if((__HAL_UART_GET_FLAG(&huart4,UART_FLAG_RXNE)!=RESET))  //接收中断(接收到的数据必须是0x0d 0x0a结尾)
//	{
//		Res=USART1->DR; 
//		if((USART_RX_STA&0x8000)==0)//接收未完成
//		{
//			if(USART_RX_STA&0x4000)//接收到了0x0d
//			{
//				if(Res!=0x0a)USART_RX_STA=0;//接收错误,重新开始
//				else USART_RX_STA|=0x8000;	//接收完成了 
//			}
//			else //还没收到0X0D
//			{	
//				if(Res==0x0d)USART_RX_STA|=0x4000;
//				else
//				{
//					USART_RX_BUF[USART_RX_STA&0X3FFF]=Res ;
//					USART_RX_STA++;
//					if(USART_RX_STA>(USART_REC_LEN-1))USART_RX_STA=0;//接收数据错误,重新开始接收	  
//				}		 
//			}
//		}   		 
//	}
//	HAL_UART_IRQHandler(&huart4);	
//#if SYSTEM_SUPPORT_OS	 	//使用OS
//	OSIntExit();  											 
//#endif
//} 
//#endif	


